package server

import (
	"data_service/models"
	"fmt"

	"golang.org/x/crypto/bcrypt"
)

// UserService 提供用户相关业务逻辑
// 供 handler 层调用，解耦 handler 与 models
// 只负责业务流程，不直接操作数据库

type UserService struct{}

func NewUserService() *UserService {
	return &UserService{}
}

// Register 注册新用户
func (s *UserService) Register(user *models.User) error {
	// 密码加密
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}
	user.Password = string(hashedPassword)
	return models.GetDB().Create(user).Error
}

// IsEmailExist 检查邮箱是否已注册
func (s *UserService) IsEmailExist(email string) bool {
	var exist models.User
	return models.GetDB().Where("email = ?", email).First(&exist).Error == nil
}

// Login 校验邮箱和密码，返回用户对象或 nil
func (s *UserService) Login(email, password string) (*models.User, error) {
	var user models.User
	if err := models.GetDB().Where("email = ?", email).First(&user).Error; err != nil {
		return nil, fmt.Errorf("用户不存在: %v", err)
	}
	// 使用bcrypt比较密码
	if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
		return nil, fmt.Errorf("密码错误: %v", err)
	}
	return &user, nil
}

// UpdateAvatar 更新用户头像
func (s *UserService) UpdateAvatar(userID int, config models.AvatarConfig) error {
	return models.GetDB().Model(&models.User{}).Where("id = ?", userID).Update("avatar", config).Error
}

// UpdateUserInfo 更新用户信息
func (s *UserService) UpdateUserInfo(userID int, name string) error {
	return models.GetDB().Model(&models.User{}).Where("id = ?", userID).Update("name", name).Error
}

// GetUserByID 获取用户信息
func (s *UserService) GetUserByID(id string) (*models.User, error) {
	var user models.User
	if err := models.GetDB().Where("id = ?", id).First(&user).Error; err != nil {
		return nil, err
	}
	return &user, nil
}

// ValidateUserToken 验证用户Token
func (s *UserService) ValidateUserToken(userId string, token string) bool {
	return models.ValidateUserToken(userId, token)
}

// SearchUsers 根据关键词搜索用户
func (s *UserService) SearchUsers(keyword string, currentUserID int) ([]models.User, error) {
	var users []models.User

	// 使用LIKE查询，支持模糊搜索用户名和邮箱
	query := models.GetDB().Where("(name LIKE ? OR email LIKE ?) AND id != ?",
		"%"+keyword+"%", "%"+keyword+"%", currentUserID)

	// 限制返回结果数量，避免性能问题
	err := query.Limit(20).Find(&users).Error
	if err != nil {
		return nil, err
	}

	// 隐藏敏感信息
	for i := range users {
		users[i].Password = ""
	}

	return users, nil
}
